package com.vercon.mobilesafe74.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.vercon.mobilesafe74.R;
import com.vercon.mobilesafe74.util.ConstantValue;
import com.vercon.mobilesafe74.util.SpUtil;
import com.vercon.mobilesafe74.util.StreamUtil;
import com.vercon.mobilesafe74.util.ToastUtil;

import org.json.JSONObject;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class SplashActivity extends AppCompatActivity {

    private static final String TAG="SplashActivity";
    private static final int UPDATE_VERSION = 100;
    private static final int ENTER_HOME = 101;
    private static final int IO_ERROR = 102;
    private static final int OUT_OF_MEMORY_ERROR = 103;
    private static final int JSON_ERROR = 104;

    private TextView tv_version_name;
    private RelativeLayout rl_root;
    private int mLocalVersionCode;
    private String mDownloadUrl;
    private String mVersionCode;
    private String mVersionDes;
    private String mVersionName;
    //Handler机制
    private Handler mHandler=new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case UPDATE_VERSION:
                    //弹出对话框，提醒用户更新
                    showUpdateDialog();
                    break;
                case IO_ERROR:
                    //直接进入程序的主界面
                    ToastUtil.show(getApplicationContext(),"IO异常");
                    enterHome();
                    break;
                case OUT_OF_MEMORY_ERROR:
                    //直接进入程序的主界面
                    ToastUtil.show(getApplicationContext(),"内存不足异常");
                    enterHome();
                    break;
                case JSON_ERROR:
                    //直接进入程序的主界面
                    ToastUtil.show(getApplicationContext(),"JSON异常");
                    enterHome();
                    break;
            }
        }
    };

    /**
     * 展示下载的对话框
     */
    protected void showUpdateDialog() {
        //对话框,是依赖于activity存在的
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //设置左上角图标
        builder.setIcon(R.drawable.baseline_adb_24);
        builder.setTitle("版本更新");
        //设置描述内容
        builder.setMessage(mVersionDes);

        //积极按钮,立即更新
        builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //下载apk,apk链接地址,downloadUrl
                downloadApk();
            }
        });

        builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //取消对话框,进入主界面
                enterHome();
            }
        });

        //点击取消事件监听
        builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                //即使用户点击取消,也需要让其进入应用程序主界面
                enterHome();
                dialog.dismiss();
            }
        });

        builder.show();
    }

    private void downloadApk() {
        //1.判断sd卡是否插入在手机里面
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            //2.获取sd卡路径
            String path=Environment.getExternalStorageDirectory().getAbsolutePath()
                    + File.separator+"app-release.apk";
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://192.168.10.5:8080/app-release.apk")
                    .build();
            try (Response response = client.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }
                File saveDir = new File(path);
                if (!saveDir.exists()) {
                    saveDir.mkdirs();
                }
                File outputFile = new File(saveDir, "file.zip");
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    Files.copy(response.body().byteStream(), outputFile.toPath());
                }
                Log.d(TAG, "File downloaded successfully.");
            } catch (IOException e) {
                Log.e(TAG, "Error downloading file: " + e.getMessage());
            }
        }
    }
    /**
     * 安装对应apk
     * @param file	安装文件
     */
    protected void installApk(File file) {
        //系统应用界面,源码,安装apk入口
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
		/*//文件作为数据源
		intent.setData(Uri.fromFile(file));
		//设置安装的类型
		intent.setType("application/vnd.android.package-archive");*/
        intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
//		startActivity(intent);
        startActivityForResult(intent, 0);
    }

    //开启一个activity后,返回结果调用的方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        enterHome();
        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     * 跳转到主界面
     */
    private void enterHome() {
        Intent intent=new Intent(this,HomeActivity.class);
        startActivity(intent);
        //在开启一个新的界面后,将导航界面关闭(导航界面只可见一次)
        finish();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        //1.初始化UI
        initView();
        //2.初始化数据
        initData();
        //3.进入页面的时候有动画
        initAnimation();
    }

    private void initAnimation() {
        // 1.创建一个AlphaAnimation对象
        AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
        // 2.设置动画的持续时间、填充模式和插值器
        alphaAnimation.setDuration(3000); // 3秒
        alphaAnimation.setFillAfter(false); // 动画结束后保持最终状态
        alphaAnimation.setInterpolator(new AccelerateInterpolator()); // 加速插值器，使动画速度逐渐加快
        // 3.启动动画
        rl_root.startAnimation(alphaAnimation);
    }

    /**
     * 初始化数据——获取版本信息
     * @return
     */
    public void initData() {
        //1.获取版本名称
        tv_version_name.setText("版本名称："+getVersionName());
        //2.检测版本
        //2.1获取本地版本
        mLocalVersionCode=getVersionCode();
        //2.2获取服务器的版本号（客户端发请求给服务器，服务器响应（Json,xml）
        /**
         * 更新版本名称
         * 新版本的描述信息
         * 服务器版本号
         * 新版本apk的下载地址
         */
//        if (SpUtil.getBoolean(this, ConstantValue.OPEN_UPDATE,false)){
//            checkVersion();
//        }else {
//            //利用消息机制进入主页面
//            mHandler.sendEmptyMessageDelayed(ENTER_HOME,1000);
//        }
        checkVersion();

    }

    /**
     * 获取服务器版本
     * @return
     */
    private void checkVersion() {
        //1.网络请求——开启子线程
        new Thread(){
            @Override
            public void run() {
                super.run();
                long startTime = System.currentTimeMillis();
                Message msg=new Message();
                try {

                    URL url=new URL("http://192.168.10.5:8080/update");
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);
                    if (connection.getResponseCode() == 200) {
                        InputStream in = connection.getInputStream();
                        String json = StreamUtil.streamToString(in);
                        Log.d(TAG, "从服务器获取的数据--->" + json);
                        //2.解析服务器返回的内容
                        JSONObject jsonObject=new JSONObject(json);
                        mDownloadUrl = jsonObject.getString("downloadUrl");
                        mVersionCode = jsonObject.getString("versionCode");
                        mVersionDes = jsonObject.getString("versionDes");
                        mVersionName = jsonObject.getString("versionName");

                        //2.1将解析的内容打印出来
                        Log.d(TAG, "下载的路径"+mDownloadUrl);
                        Log.d(TAG, "下载的版本号"+mVersionCode);
                        Log.d(TAG, "下载新版本的内容描述"+mVersionDes);
                        Log.d(TAG, "下载的名称"+mVersionName);

                        //3.对比版本号（服务器版本号>本地版本号，提示用户更新）
                        if (mLocalVersionCode<Integer.parseInt(mVersionName)){
                            //提醒用户更新（弹出对话框，消息机制）
                            msg.what=UPDATE_VERSION;
                        }else {
                            //进入应用程序主界面
                            msg.what=ENTER_HOME;
                        }
                    } else {
                        Log.d(TAG, "服务器返回错误响应码: " + connection.getResponseCode());
                        // 处理错误响应码，比如重新尝试连接，或者报告错误给用户等。
                    }
                } catch (IOException e) {
                    Log.d(TAG, "发生IO异常: " + e.getMessage());
                    // 处理IO异常，比如重新尝试连接，或者报告错误给用户等。
                    msg.what=IO_ERROR;
                } catch (OutOfMemoryError e) {
                    Log.d(TAG, "内存不足: " + e.getMessage());
                    // 处理内存不足问题，比如关闭一些不必要的应用程序，或者报告错误给用户等。
                    msg.what=OUT_OF_MEMORY_ERROR;
                } catch (Exception e) {
                    Log.d(TAG, "发生其他异常: " + e.getMessage());
                    msg.what=JSON_ERROR;
                    // 处理其他异常。
                }finally {
                    //指定睡眠时间，如果网络请求的时长超过5秒则不做处理
                    //请求网络时长小于5秒，强制让其睡眠到5秒
                    long endTime = System.currentTimeMillis();
                    if (endTime-startTime<5000){
                        try {
                            Thread.sleep(4000-(endTime-startTime));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    mHandler.sendMessage(msg);
                }
            }
        }.start();
    }

    /**
     * 获取本地版本号
     * @return
     */
    private int getVersionCode() {
        //1.通过系统提供的API——getPackageManager
        PackageManager pm = getPackageManager();
        //2.拿到PackageInfo 参数1：当前应用名称 参数2:0表示基本信息
        try {
            PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取版本名称
     * @return
     */
    public String getVersionName() {
        //1.通过系统提供的API——getPackageManager
        PackageManager pm = getPackageManager();
        //2.拿到PackageInfo 参数1：当前应用名称 参数2:0表示基本信息
        try {
            PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(), 0);
            return packageInfo.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 初始化UI
     */
    public void initView() {
        tv_version_name = findViewById(R.id.tv_version_name);
        rl_root = findViewById(R.id.rl_root);
    }
}